﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Net;
using SegIdenPC.Entidad;
using SegIdenPC.Herramientas;
using GS1.Utilitario;
using System.Configuration;

namespace SegIdenPC
{
    public class ConexionREST
    {
        #region --- Variables y Constantes ----
        // URL Servicio REST (Local)
        private static string SERVICIO_REST_URL = ConfigurationManager.AppSettings[Constantes.URL_SERVICIO]; 

        // Tiempo de espera de respuesta del Servicio REST
        private static int SERVICO_REST_TIEMPO_ESPERA = ConfigurationManager.AppSettings[Constantes.TIEMPO_ESPERA].ToEntero();
        //35000;
        #endregion

        #region --- Metodos Propios ---
        /// <summary>
        /// Metodo: Que permite enviar una operacion al servicio REST
        /// </summary>
        /// <param name="operacion">Operacion a enviar al servicio</param>
        /// <returns>Trama obtenida como resultado</returns>
        public string ejecutarOperacion(Operacion operacion)
        {
            string resultadoXML = string.Empty;

            // Convirtiendo la operacion a enviar a bytes
            byte[] dataByte = Utilitario.PersonalizadoStringToByteArray(operacion.SerializarToXml());

            try
            {
                // Estableciendo la URL del servicio REST
                HttpWebRequest POSTRequest = (HttpWebRequest)WebRequest.Create(SERVICIO_REST_URL);
                // Tipo de Metodo
                POSTRequest.Method = Constantes.METODO_POST;
                // Tipo de informacion a enviar
                POSTRequest.ContentType = Constantes.TIPO_MIME_HTTP;
                POSTRequest.KeepAlive = false;
                POSTRequest.Timeout = SERVICO_REST_TIEMPO_ESPERA;
                // Longitud de la informacion a enviar
                POSTRequest.ContentLength = dataByte.Length;

                // Estableciendo el flujo a enviar
                Stream POSTstream = POSTRequest.GetRequestStream();
                // Escribiendo data de bytes a enviar
                POSTstream.Write(dataByte, 0, dataByte.Length);

                // Liberando flujo a enviar
                POSTstream.Flush();
                POSTstream.Close();

                // Estableciendo conexion con el Servicio REST
                HttpWebResponse POSTResponse = (HttpWebResponse)POSTRequest.GetResponse();

                // Validar respuesta
                if (POSTResponse.StatusCode == HttpStatusCode.OK)
                {
                    // Obteniendo data retornada
                    StreamReader reader = new StreamReader(POSTResponse.GetResponseStream(), ParametrosAplicacion.EncodingAplicacion);

                    // Capturando data en formato String
                    resultadoXML = reader.ReadToEnd();

                    // Liberando flujo de recibir
                    reader.Close();
                }
            }
            catch (WebException)
            {
                throw new Exception("No hay conexión con el Servidor Principal" + Environment.NewLine +
                                    "Por favor verifique si tiene acceso a la red de la empresa.");
            }

            return resultadoXML;
        }
        #endregion
    }
}
